package com.campus.food.mapper;

import com.campus.food.model.entity.Food;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 菜品Mapper接口
 * 
 * @author Claude3.7 Sonnet
 * @since 2025-05-29
 */
@Mapper
public interface FoodMapper {
    
    /**
     * 根据ID查询菜品
     */
    Food selectById(@Param("id") Long id);
    
    /**
     * 插入菜品
     */
    int insert(Food food);
    
    /**
     * 更新菜品信息
     */
    int updateById(Food food);
    
    /**
     * 更新菜品状态
     */
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);
    
    /**
     * 更新菜品销量
     */
    int updateSales(@Param("id") Long id, @Param("sales") Integer sales);
    
    /**
     * 根据ID删除菜品
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 根据商家ID查询菜品列表
     */
    List<Food> selectByMerchantId(@Param("merchantId") Long merchantId,
                                 @Param("status") Integer status);
    
    /**
     * 分页查询菜品列表（商家端）
     */
    List<Food> selectPageByMerchant(@Param("merchantId") Long merchantId,
                                   @Param("offset") Integer offset,
                                   @Param("limit") Integer limit,
                                   @Param("name") String name,
                                   @Param("category") String category,
                                   @Param("status") Integer status);
    
    /**
     * 查询菜品总数（商家端）
     */
    Long selectCountByMerchant(@Param("merchantId") Long merchantId,
                              @Param("name") String name,
                              @Param("category") String category,
                              @Param("status") Integer status);
    
    /**
     * 分页查询菜品列表（用户端）
     */
    List<Food> selectPageForUser(@Param("merchantId") Long merchantId,
                                @Param("offset") Integer offset,
                                @Param("limit") Integer limit,
                                @Param("name") String name,
                                @Param("category") String category);
    
    /**
     * 查询菜品总数（用户端）
     */
    Long selectCountForUser(@Param("merchantId") Long merchantId,
                           @Param("name") String name,
                           @Param("category") String category);
    
    /**
     * 根据分类查询菜品列表
     */
    List<Food> selectByCategory(@Param("merchantId") Long merchantId,
                               @Param("category") String category);
    
    /**
     * 查询商家的菜品分类列表
     */
    List<String> selectCategoriesByMerchant(@Param("merchantId") Long merchantId);
    
    /**
     * 查询热销菜品
     */
    List<Food> selectHotFoods(@Param("merchantId") Long merchantId,
                             @Param("limit") Integer limit);
    
    /**
     * 批量查询菜品
     */
    List<Food> selectByIds(@Param("ids") List<Long> ids);
    
    /**
     * 增加菜品销量
     */
    int increaseSales(@Param("id") Long id, @Param("quantity") Integer quantity);
    
    /**
     * 批量删除菜品
     */
    int deleteBatch(@Param("ids") List<Long> ids);
    
    /**
     * 搜索菜品
     */
    List<Food> searchFoods(@Param("keyword") String keyword,
                          @Param("offset") int offset,
                          @Param("size") int size,
                          @Param("merchantId") Long merchantId,
                          @Param("category") String category,
                          @Param("minPrice") Double minPrice,
                          @Param("maxPrice") Double maxPrice);
    
    /**
     * 获取推荐菜品
     */
    List<Food> selectRecommendedFoods(@Param("merchantId") Long merchantId, @Param("limit") int limit);
    
    /**
     * 获取菜品分类列表
     */
    List<String> selectCategories(@Param("merchantId") Long merchantId);
    
    /**
     * 批量更新菜品状态
     */
    int updateStatusBatch(@Param("ids") List<Long> ids, @Param("status") Integer status);
    
    /**
     * 获取菜品销量统计
     */
    List<Food> selectSalesStats(@Param("merchantId") Long merchantId,
                               @Param("startDate") String startDate,
                               @Param("endDate") String endDate);
    
    /**
     * 获取所有菜品列表（管理员专用）
     */
    List<Food> selectAllForAdmin(@Param("offset") int offset,
                                @Param("size") int size,
                                @Param("merchantId") Long merchantId,
                                @Param("category") String category,
                                @Param("status") Integer status);
} 